package 位运算;

public class No461汉明距离 {

    /**
     * 两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。
     * 给出两个整数 x 和 y，计算它们之间的汉明距离。
     * 注意：
     * 0 ≤ x, y < 231.
     *
     * 示例:
     * 输入: x = 1, y = 4
     * 输出: 2
     * 解释:
     * 1   (0 0 0 1)
     * 4   (0 1 0 0)
     *        ↑   ↑
     * 上面的箭头指出了对应二进制位不同的位置。
     */

    //转十进制后再进行每一位的比较,不是很好的做法
    //应该采用位运算
    public int hammingDistance(int x, int y) {

        int xy=x^y;

        //不采用bigCount的话,可以自己写一个
        int result=0;
        int num=1;
//        System.out.println(Integer.toUnsignedString(xy,2));
        while (num<=xy){

//            System.out.println(Integer.toUnsignedString(num,2));
            if((num&xy)>0){
                result++;
            }
            //让num左移可能会溢出,所以应该让原数字右移动
//            num<<=1;
            xy>>=1;
//            System.out.println(num);
//            System.out.println(xy);
        }

        return result;
    }

    public static void main(String[] args) {
        No461汉明距离 n=new No461汉明距离();
        int result = n.hammingDistance(680142203, 1111953568);
        System.out.println(result);
        //1101010110011010011010111011011
        //10000000000000000000000000000000
    }

}
